﻿Public Class Abm_localidad
    Enum estado
        modificar
        insertar
        consultar
    End Enum

    Dim proximoId As Integer
    Dim datos As AccesoADatos
    Dim carga As ManejoDeCarga
    Dim editar As estado

    Private Sub Abm_localidades_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        datos = New AccesoADatos()
        carga = New ManejoDeCarga()
        carga_grilla("")
        modo(estado.consultar)
        ToolTip1.SetToolTip(Me.btn_nuevo, "Crear un nuevo registro")
        ToolTip1.SetToolTip(Me.btn_modificar, "Modificar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_eliminar, "Eliminar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_buscar, "Realizar búsqueda")
        ToolTip1.SetToolTip(Me.btn_cancelar, "Cancelar la operación actual")
        ToolTip1.SetToolTip(Me.btn_guardar, "Guardar los datos cargados")
        ToolTip1.SetToolTip(Me.btn_salir, "Salir del formulario")
    End Sub

    Private Sub carga_grilla(ByRef where As String)
        If where = "" Then
            carga.cargarGrilla(dgv_localidades, "nombre as Localidad, id_localidad ", "Localidad")
        Else
            carga.cargarGrilla(dgv_localidades, "nombre as Localidad, id_localidad ", "Localidad", where)
        End If
        dgv_localidades.Columns(1).Visible = False
    End Sub

    Private Sub modo(ByRef e As estado)
        editar = e
        Select Case e
            Case estado.consultar
                Me.btn_buscar.Enabled = True
                Me.txt_nombre.Enabled = False
                btn_guardar.Enabled = False
                Me.txt_buscarNombre.Enabled = True
                Me.dgv_localidades.Enabled = True
                pnl_controlesCarga.Enabled = True
                pnl_controlesConfirmacion.Enabled = False
                Exit Select
            Case estado.insertar
                Me.btn_buscar.Enabled = False
                Me.txt_nombre.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarNombre.Enabled = False
                Me.dgv_localidades.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Exit Select
            Case estado.modificar
                Me.btn_buscar.Enabled = False
                Me.txt_nombre.Enabled = True
                btn_guardar.Enabled = True
                Me.txt_buscarNombre.Enabled = False
                Me.dgv_localidades.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Exit Select
        End Select
    End Sub

    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
        Me.calcular_proximo_id()
        Me.modo(estado.insertar)
        Me.limpiar_campos()
        Me.txt_nombre.Focus()
    End Sub

    Private Sub calcular_proximo_id()
        Dim tabla As New Data.DataTable
        tabla = datos.leerTabla("MAX(id_localidad)", "Localidad")
        proximoId = tabla.Rows(0)(0) + 1
    End Sub

    Private Sub btn_modificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_modificar.Click
        modo(estado.modificar)
        Dim pk As Integer = Me.dgv_localidades.CurrentRow.Cells(1).Value
        Dim dt As New Data.DataTable
        dt = datos.leerTabla("*", "Localidad", "id_localidad = " & pk)
        Me.txt_nombre.Text = dt.Rows(0)("nombre")
        Me.txtpk.Text = pk
    End Sub

    Private Sub btn_Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If MessageBox.Show("¿Esta seguro que desea borrar la localidad seleccionada?", "Importante", _
                                                MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
            datos.borrarRegistro("Localidad", "id_localidad", Me.dgv_localidades.CurrentRow.Cells(1).Value)
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub limpiar_campos()
        txt_nombre.Clear()
        txt_buscarNombre.Clear()
        carga_grilla("")
    End Sub

    Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
        Dim mensaje As String = "¿Esta seguro que desea cancelar la operación actual?"
        If editar = estado.consultar Then
            mensaje = "¿Cancelar la búsqueda?"
        End If
        If MessageBox.Show(mensaje, "Confirmación", MessageBoxButtons.YesNo, _
                           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
        If validar_carga() Then
            If editar = estado.insertar Then
                If insertar_localidad() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    proximoId += 1
                    MessageBox.Show("Localidad agregada correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                If modificar_localidad() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    MessageBox.Show("Localidad modificada correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End If
    End Sub

    Private Function validar_carga() As Boolean
        If validar_vacios() Then
            If validar_contenido() Then
                Return True
            End If
        End If
        Return False
    End Function

    Private Function validar_existencia() As Boolean
        If datos.leerTabla("*", "Localidad", "nombre= '" & txt_nombre.Text & "'").Rows.Count() <> 0 Then
            MessageBox.Show("Ya existe una localidad con el nombre ingresado", "Localidad no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_vacios() As Boolean
        Dim validacion As Boolean = True
        If txt_nombre.Text = "" Then
            MessageBox.Show("Debe completar todos los campos", "Localidad no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Function validar_contenido() As Boolean
        If IsNumeric(txt_nombre.Text) Then
            MessageBox.Show("El nombre de localidad debe ser texto", "Localidad no agregada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function insertar_localidad() As Boolean
        Dim exito As Boolean = True
        If validar_existencia() Then
            Dim valores As String = proximoId & ", '" & Me.txt_nombre.Text & "'"
            Try
                datos.insertarRegistro("Localidad", valores)
            Catch ex As OleDb.OleDbException
                exito = False
                MessageBox.Show("Error cargando la localidad en la base de datos", "Localidad no agregada", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            exito = False
        End If
        Return exito
    End Function

    Private Function modificar_localidad() As Boolean
        Dim exito As Boolean = True
        Dim valores As String
        valores = "nombre = '" & Me.txt_nombre.Text & "'"
        Try
            datos.modificarRegistro("Localidad", valores, "id_localidad", txtpk.Text)
        Catch ex As OleDb.OleDbException
            exito = False
            MessageBox.Show("Debe completar los campos correctamente", "Localidad no modificada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
        Return exito
    End Function

    Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
        If validar_campos_de_busqueda() Then
            Dim clausulas As Integer = 0
            Dim where As String = ""
            If txt_buscarnombre.Text <> "" Then
                If validarBuscarNombre() Then
                    where = "nombre LIKE '%" & txt_buscarNombre.Text & "%'"
                    clausulas += 1
                End If
            End If
            Try
                carga_grilla(where)
            Catch ex As OleDb.OleDbException
                MessageBox.Show("Debe completar los campos correctamente", "Error de búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                limpiar_campos()
            End Try
        End If
    End Sub
    Private Function validarBuscarNombre() As Boolean
        If IsNumeric(txt_buscarNombre.Text) Then
            MessageBox.Show("El nombre debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_campos_de_busqueda() As Boolean
        Dim validacion As Boolean = True
        If txt_buscarNombre.Text = "" Then
            MessageBox.Show("Debe completar el nombre para realizar la búsqueda", "Error en la búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        If System.Windows.Forms.DialogResult.OK = MessageBox.Show("Cerrar esta ventana?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) Then
            Me.Close()
        End If
    End Sub
End Class